package org.joget.plugin.etl;
import org.joget.plugin.base.ApplicationPlugin;
import org.joget.plugin.base.DefaultPlugin;
import org.joget.plugin.base.PluginProperty;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.util.WorkflowUtil;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class FormDataEtlPlugin extends DefaultPlugin implements ApplicationPlugin {
public static final String FORM_DATA = "form";
public static final String WORKFLOW_ASSIGNMENT = "assignment";
public static final String WORKFLOW_VARIABLE = "variable";
public String getName() {
return "Database Plugin";
}
public String getDescription() {
return "Executes SQL INSERT and UPDATE statement on MySQL, Oracle or SQL Server database";
}
public String getVersion() {
return "1.0.11";
}
public PluginProperty[] getPluginProperties() {
PluginProperty[] properties = new PluginProperty[]{
new PluginProperty("formDataTable", "Form Data Table", PluginProperty.TYPE_TEXTFIELD, null, ""),
new PluginProperty("driverClassName", "Driver Class Name", PluginProperty.TYPE_TEXTFIELD, null, "com.mysql.jdbc.Driver"),
new PluginProperty("url", "Target DB URL", PluginProperty.TYPE_TEXTFIELD, null, "jdbc:mysql://localhost/"),
new PluginProperty("username", "Username", PluginProperty.TYPE_TEXTFIELD, null, "root"),
new PluginProperty("password", "Password", PluginProperty.TYPE_PASSWORD, null, ""),
new PluginProperty("query", "Query", PluginProperty.TYPE_TEXTAREA, null, null)
};
return properties;
}
public Object execute(Map properties) {
Object result = null;
try {
String formDataTable = (String) properties.get("formDataTable");
String driverClassName = (String) properties.get("driverClassName");
String url = (String) properties.get("url");
String username = (String) properties.get("username");
String password = (String) properties.get("password");
String query = (String) properties.get("query");
WorkflowAssignment wfAssignment = (WorkflowAssignment) properties.get("workflowAssignment");
Map<String, String> replace = new HashMap<String, String>();
if(driverClassName.equalsIgnoreCase("com.mysql.jdbc.Driver")){
replace.put("\\\\", "\\\\");
replace.put("'", "\\'");
}else{
replace.put("'", "''");
}
query = WorkflowUtil.processVariable(query, formDataTable, wfAssignment, "regex", replace);
Properties props = new Properties();
props.put("driverClassName", driverClassName);
props.put("url", url);
props.put("username", username);
props.put("password", password);
DataSource ds = createDataSource(props);
result = executeQuery(ds, query);
return result;
} catch (Exception e) {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "Error executing plugin", e);
return null;
}
}
protected DataSource createDataSource(Properties props) throws Exception {
DataSource ds = BasicDataSourceFactory.createDataSource(props);
return ds;
}
protected boolean executeQuery(DataSource ds, String sql) throws SQLException {
Connection con = null;
Statement stmt = null;
try {
con = ds.getConnection();
stmt = con.createStatement();
boolean result = stmt.execute(sql);
return result;
} finally {
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
}
}
}